package app.maker.metier.stock.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import app.maker.entity.Entrepot;
import app.maker.entity.EntrepotHasProduit;
import app.maker.entity.Fournisseur;
import app.maker.entity.Produit;
import app.maker.error.EntrepotException;
import app.maker.error.FournisseurException;
import app.maker.error.ProduitException;
import app.maker.metier.stock.intf.IGestionProduit;
import app.maker.stock.intf.IEntrepot;
import app.maker.stock.intf.IFournisseur;
import app.maker.stock.intf.IProduit;

@Stateless(mappedName = "gestionProduit")
public class GestionProduit implements IGestionProduit {

	@EJB
	private IProduit iProduit;

	@EJB
	private IEntrepot iEntrepot;

	@EJB
	private IFournisseur iFournisseur;

	public void ajoutProduit(Produit produit) throws ProduitException, FournisseurException {
		if((produit.getCategorie() == null) || (produit.getLocalisation() ==
				null) || (produit.getNom() == null) || (produit.getPrixGrossiste() <=
				0) || (produit.getPrixUnitaire() <= 0) || (produit.getQuantite() <=
				0) || ((produit.getProduitFini() != 0) && (produit.getProduitFini()
						!=1))) { throw new
			ProduitException("Les champs ne sont pas correctement renseignés!!");
		}

		Fournisseur fournisseurBd = iFournisseur.getFournisseurByName(produit.getFournisseur().getNom());

		produit.setFournisseur(fournisseurBd);
		iProduit.updateProduit(produit);
	}

	public void ajouterProduitDansEntrepot(Produit produit, Entrepot entrepot)
			throws ProduitException, EntrepotException {

		if((produit.getCategorie() == null) || (produit.getLocalisation() ==
				null) || (produit.getNom() == null) || (produit.getPrixGrossiste() <=
				0) || (produit.getPrixUnitaire() <= 0) || (produit.getQuantite() <=
				0) || ((produit.getProduitFini() != 0) && (produit.getProduitFini()
						!=1))) { throw new
			ProduitException("Les champs ne sont pas correctement renseignés!!");
		}

		float quantiteMAJ = produit.getQuantite();
		Entrepot entrepotBd = null;
		List<EntrepotHasProduit> listeMAJ = null;

		entrepotBd = iEntrepot.getEntrepotByName(entrepot.getBatiment());
		listeMAJ = entrepotBd.getEntrepotHasProduits();
		Produit produitBd = iProduit.getProduitByName(produit.getNom());


		//Cas ou le produit existe deja dans l'entrepot -> mise a jour de la quantite
		if (listeMAJ.size() != 0) { 
			for (EntrepotHasProduit e : listeMAJ) {
				if ((e.getProduit().getIdProduit() == produitBd.getIdProduit()) &&
						(e.getEntrepot().getIdEntrepot() == entrepotBd.getIdEntrepot())) {
					//Nous avons trouve la ligne recherchee 
					e.setQuantite(e.getQuantite() + quantiteMAJ); 
					entrepotBd.setEntrepotHasProduits(listeMAJ);
					iEntrepot.updateEntrepot(entrepotBd); 

					produitBd.setQuantite(produitBd.getQuantite() + quantiteMAJ);

					iProduit.updateProduit(produitBd);
					break;
				}
			}
		} else {
			// Cas ou le produit n'existe pas dans l'entrepot
			listeMAJ = new ArrayList<EntrepotHasProduit>();
			EntrepotHasProduit nvLigne = new EntrepotHasProduit();

			produitBd.setQuantite(produitBd.getQuantite());

			nvLigne.setEntrepot(entrepotBd);
			nvLigne.setProduit(produitBd);
			nvLigne.setQuantite(quantiteMAJ);
			listeMAJ.add(nvLigne);

			//entrepotBd.setEntrepotHasProduits(listeMAJ);
			produitBd.setEntrepotHasProduits(listeMAJ);
			iProduit.updateProduit(produitBd);
			//iEntrepot.updateEntrepot(entrepotBd);

		}
	}

	public void supprimeProduit(Produit produit, Entrepot entrepot)
			throws ProduitException, EntrepotException {
		if ((produit.getCategorie() == null)
				|| (produit.getLocalisation() == null)
				|| (produit.getNom() == null)
				|| (produit.getPrixGrossiste() <= 0)
				|| (produit.getPrixUnitaire() <= 0)
				|| (produit.getQuantite() <= 0)
				|| (produit.getProduitFini() != 0)
				&& (produit.getProduitFini() != 1)) {
			throw new ProduitException(
					"Les champs ne sont pas correctement renseignés!!");
		}

		float quantiteMAJ = produit.getQuantite();
		List<EntrepotHasProduit> listeMAJ = entrepot.getEntrepotHasProduits();

		for (EntrepotHasProduit e : listeMAJ) {
			if ((e.getProduit().getIdProduit() == produit.getIdProduit())
					&& (e.getEntrepot().getIdEntrepot() == entrepot
					.getIdEntrepot())) {
				// Nous avons trouve la ligne recherchee
				e.setQuantite(e.getQuantite() - quantiteMAJ);
				if (e.getQuantite() == 0) {
					listeMAJ.remove(e);
				}
				entrepot.setEntrepotHasProduits(listeMAJ);
				iEntrepot.updateEntrepot(entrepot);
			}
		}

		iProduit.updateProduit(produit);

	}

	public void supprimeProduitDansEntrepots(Produit produit)
			throws ProduitException {
		if ((produit.getCategorie() == null)
				|| (produit.getLocalisation() == null)
				|| (produit.getNom() == null)
				|| (produit.getPrixGrossiste() <= 0)
				|| (produit.getPrixUnitaire() <= 0)
				|| (produit.getQuantite() <= 0)
				|| (produit.getProduitFini() != 0)
				&& (produit.getProduitFini() != 1)) {
			throw new ProduitException(
					"Les champs ne sont pas correctement renseignés!!");
		}

		List<EntrepotHasProduit> listeMAJ = produit.getEntrepotHasProduits();

		for (EntrepotHasProduit e : listeMAJ) {
			if (e.getProduit().getIdProduit() == produit.getIdProduit()) {
				// Nous avons trouve la ligne recherchee
				listeMAJ.remove(e);
				produit.setEntrepotHasProduits(listeMAJ);
			}
		}

		iProduit.updateProduit(produit);

	}

	public Produit rechercherProduits(Entrepot entrepot, int idProduit)
			throws ProduitException {

		List<EntrepotHasProduit> lp = entrepot.getEntrepotHasProduits();

		for (EntrepotHasProduit e : lp) {
			if ((e.getProduit().getIdProduit() == idProduit)
					&& (e.getEntrepot().getIdEntrepot() == entrepot
					.getIdEntrepot())) {
				return iProduit.getProduit(idProduit);
			}
		}
		return null;
	}

	public List<Produit> getAllProduits(List<Entrepot> listeEntrepot) {
		List<Produit> listeProduit = new ArrayList<Produit>();

		for (Entrepot e : listeEntrepot) {
			List<EntrepotHasProduit> lp = e.getEntrepotHasProduits();
			for (EntrepotHasProduit ehp : lp) {
				listeProduit.add(ehp.getProduit());
			}
		}
		return listeProduit;
	}

	public Entrepot rechercherEntrepot(int idEntrepot) throws EntrepotException {
		return iEntrepot.getEntrepot(idEntrepot);
	}

	public List<Entrepot> getAllEntrepots() {
		return iEntrepot.getAllEntrepot();
	}

	public void ajouterEntrepot(Entrepot entrepot) throws EntrepotException {
		if (entrepot.getBatiment() == null) {
			throw new EntrepotException(
					"Les champs ne sont pas renseignés correctement!");
		}
		iEntrepot.updateEntrepot(entrepot);
	}

	public void supprimerEntrepot(Entrepot entrepot) throws EntrepotException {
		if (entrepot.getBatiment() == null) {
			throw new EntrepotException(
					"Les champs ne sont pas renseignés correctement!");
		}
		iEntrepot.deleteEntrepot(entrepot);
	}

	public void ajouterFournisseur(Fournisseur fournisseur)
			throws FournisseurException {
		if (fournisseur.getAdresse().compareTo("") == 0) {
			throw new FournisseurException(
					"Adresse d'un fournisseur ne peut pas être nulle!");
		}
		if (fournisseur.getEmail().compareTo("") == 0) {
			throw new FournisseurException(
					"Email d'un fournisseur ne peut pas être nulle!");
		}
		if (fournisseur.getNom().compareTo("") == 0) {
			throw new FournisseurException(
					"Nom d'un fournisseur ne peut pas être nulle!");
		}
		if (fournisseur.getTelephone().compareTo("") == 0) {
			throw new FournisseurException(
					"Téléphone d'un fournisseur ne peut pas être nulle!");
		}

		this.iFournisseur.updateFournisseur(fournisseur);

	}

	public void supprimerFournisseur(Fournisseur fournisseur)
			throws FournisseurException {
		boolean trouve = false;
		List<Fournisseur> allFournisseurs = this.iFournisseur
				.getAllFournisseur();

		for (Fournisseur f : allFournisseurs) {
			if (f.getIdFournisseur() == fournisseur.getIdFournisseur()) {
				this.iFournisseur.deleteFournisseur(f);
				trouve = true;
				break;
			}
		}

		if (!trouve) {
			throw new FournisseurException("Fournisseur non trouvé!");
		}
	}

	public void miseAJourFournisseur(Fournisseur fournisseur)
			throws FournisseurException {
		List<Fournisseur> allFournisseurs = this.iFournisseur
				.getAllFournisseur();
		int id = -1;
		boolean trouve = false;

		for (Fournisseur f : allFournisseurs) {
			if (f.getNom().compareTo(fournisseur.getNom()) == 0) {
				trouve = true;
				id = f.getIdFournisseur();
				break;
			}
		}

		if (trouve) {
			fournisseur.setIdFournisseur(id);
			this.iFournisseur.updateFournisseur(fournisseur);
		} else {
			throw new FournisseurException(
					"Fournisseur pour la mise à jour non trouvé!");
		}
	}

	public Fournisseur rechercherFournisseur(int idFournisseur)
			throws FournisseurException {
		Fournisseur retour = null;

		List<Fournisseur> allFournisseurs = this.iFournisseur
				.getAllFournisseur();
		for (Fournisseur f : allFournisseurs) {
			if (f.getIdFournisseur() == idFournisseur) {
				retour = f;
				break;
			}
		}

		if (retour != null) {
			return retour;
		} else {
			throw new FournisseurException(
					"Fournisseur non trouvé avec cet identifiant!");
		}
	}

	public List<Fournisseur> rechercherFournisseur(String nomFournisseur)
			throws FournisseurException {
		List<Fournisseur> fournisseursRetour = new ArrayList<Fournisseur>();

		List<Fournisseur> allFournisseurs = this.iFournisseur
				.getAllFournisseur();
		for (Fournisseur f : allFournisseurs) {
			if (f.getNom().compareTo(nomFournisseur) == 0) {
				fournisseursRetour.add(f);
			}
		}

		if (!fournisseursRetour.isEmpty()) {
			return fournisseursRetour;
		} else {
			throw new FournisseurException("Aucun fournisseur trouvé à ce nom!");
		}
	}

}
